/*******************************************************************************
 * Copyright (c) 2017-2021, org.smartboot. All rights reserved.
 * project name: smart-http
 * file name: HttpResponse.java
 * Date: 2021-02-07
 * Author: sandao (zhengjunweimail@163.com)
 ******************************************************************************/

package org.ricks.net.http;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.Map;

/**
 * Http消息响应接口
 *
 * @author 三刀
 * @version V1.0 , 2018/2/3
 */
public interface HttpResponse {

    /**
     * 响应消息输出流
     *
     * @return
     */
    BufferOutputStream getOutputStream();

    /**
     * 获取Http响应状态
     *
     * @return
     */
    int getHttpStatus();

    /**
     * 设置Http响应状态,若不设置默认{@link HttpStatus#OK}
     *
     * @param httpStatus
     */
    void setHttpStatus(HttpStatus httpStatus);

    /**
     * 设置Http响应状态,若不设置默认{@link HttpStatus#OK}
     *
     * @param httpStatus
     */
    void setHttpStatus(int httpStatus, String reasonPhrase);

    /**
     * 获取Http响应描述
     *
     * @return
     */
    String getReasonPhrase();

    /**
     * 设置请求头
     * @param name
     * @param value
     */
    void setHeader(String name, String value);

    void addHeader(String name, String value);

    String getHeader(String name);

    Collection<String> getHeaders(String name);

    Collection<String> getHeaderNames();

    void setContentLength(int contentLength);

    int  getContentLength();

    void setContentType(String contentType);

    String getContentType();

    void write(byte[] data) throws IOException;

    public String getCharacterEncoding();

    public void setCharacterEncoding(String charset);

    public void close();

    /**
     * 添加Cookie信息
     *
     * @param cookie
     */
    void addCookie(Cookie cookie);


    /**
     * 设置下载文件
     *
     * @param file
     */
    void setDownloadFile(File file);


    /**
     * 流的下载文件
     *
     * @param inputStream
     * @param fileName
     */
    void setDownloadFile(InputStream inputStream, String fileName);

    /**
     * 发送Object对象自动转json
     *
     * @param object
     */
    void sendJson(Object object);

    /**
     * 发送String的字符串
     *
     * @param jsonStr
     */
    void sendJsonString(String jsonStr);

    /**
     * 发送HTML
     *
     * @param html
     */
    void sendHtml(String html);

    /**
     * 发送文本
     *
     * @param text
     */
    void sendText(String text);

    /**
     * 重定向
     *
     * @param url
     */
    void redirect(String url);
}
